import Vuex  from 'vuex'


export default new Vuex.Store(
{
//全局命名空间
  namespaced:true,
  //state中管理的全局变量
  state:{
    //购物车的数组，用来存储购物车中每个商品的信息对象
    //每个商品的信息对象,都包含如下6个属性
    //{goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
    //项目初始化时，会自动将数据加载到内存,如果没有这个数据的话
    //会自动变成[],数组
    cart:JSON.parse(uni.getStorageSync('cart') || '[]')
  },
  //操作state中变量的方法
  mutations:{
    //还需要注意，这里的第一个参数state是不用显示声明的，就相当于是
    //python中方法定义中的self参数
    addToCart(state,goods){
      // 判断购物车中是否有该商品，如果没有，则添加，如果有，则给其结果加1
      const findResult=state.cart.find(x=>x.goods_id===goods.goods_id)
      if(!findResult){
        state.cart.push(goods)
      }else{
        //这里面还牵扯一个相同的js对象是会被放在同一个引用地址中的
        findResult.goods_count++
      }
      //每一次添加数据，就会持久化保存到本地,也就是磁盘,这部代码是用来执行这个方法
      this.commit('saveToStorage')
    },
    saveToStorage(state){
      uni.setStorageSync('cart',JSON.stringify(state.cart))
    },
    updateGoodsState(state,goods){
      // 使用find方法可以对数组进行有条件的筛选，可以筛选出指定的goods_id所对应的那一个js对象
      const findResult=state.cart.find(x=>x.goods_id===goods.goods_id)
      if(findResult){
        // 修改findResult的goods_state属性
        findResult.goods_state=goods.goods_state
      }
      // 进行持久化保存
      this.commit('saveToStorage')
    },
    updateGoodsCount(state,goods){
      const findResult=state.cart.find(x=>x.goods_id==goods.goods_id)
      if(findResult){
        findResult.goods_count=goods.goods_count
        this.commit('saveToStorage')
      }
    },
    removeGoodsById(state,goods){
      // 根据id删除相应数据，利用过滤函数将符合条件的过滤走，先过滤,把过滤后的值覆盖state中的数组
      state.cart=state.cart.filter(x=>x.goods_id!==goods.goods_id)
      // 持久化保存，再保存
      this.commit('saveToStorage')
    },
    // 实现全选，或反选
    updateAllGoodsState(state,newState){
      state.cart.forEach(x=>x.goods_state=newState)
      this.commit('saveToStorage')
    }
  },
  // getters这个节点就是一个计算属性，它可以计算与全局state值有关的
  //相关属性
  getters:{
    total(state){
      let c=0
      state.cart.forEach(x=>c+=x.goods_count)
      return c
    },
    // 用来动态获取勾选数组的数量
    checkCount(state){
      return state.cart.filter(x=>x.goods_state).reduce((total,item)=>total+=item.goods_count,0)
    },
    totalMoney(state){
      return state.cart.filter(x=>x.goods_state).reduce((total,item)=>total+=(item.goods_price*item.goods_count),0)
    }
  }
}
)